home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
CU Amiga Super CD-ROM 17
/
CU Amiga Magazine's Super CD-ROM 17 (1997)(EMAP Images)(GB)[!][issue 1997-12].iso
/
CUCD
/
Programming
/
DiceSource
/
src
/
das
/
passa.c
< prev
next >
Wrap
C/C++ Source or Header
|
1997-09-09
|
2KB
|
100 lines
/*
* (c)Copyright 1992-1997 Obvious Implementations Corp. Redistribution and
* use is allowed under the terms of the DICE-LICENSE FILE,
* DICE-LICENSE.TXT.
*/
/*
* PASSA
*
* Scan and resolve all label types & opcodes. fields:
* Label
* OpCode
* OpSize (0 == unspecified)
*
* Creates appropriate MachCtx structures
*/
#include "defs.h"
Prototype void PassA(void);
void
PassA()
{
char *ptr = AsBuf;
char c;
MachCtx *mc;
long lineno = 0;
while ((c = *ptr) != 0) {
LineNo = ++lineno;
if (c == '\n') {
++ptr;
continue;
}
mc = AllocStructure(MachCtx);
mc->Sect = CurSection;
mc->LineNo = lineno;
MBase[MLines++] = mc;
if (c != ' ' && c != '\t') { /* label */
char *skip = ptr;
Label *label;
while (c != '\n' && c != ' ' && c != '\t' && c != ':')
c = *++ptr;
*ptr = 0;
mc->Label = label = GetLabelByName(skip);
if (label->Sect && label->Sect->Type != SECT_COMMON) {
cerror(EERROR_LABEL_MULTIPLY_DEFINED, label->Name);
} else {
label->Sect = CurSection;
label->MC = MBase + MLines - 1;
}
if (c == ':')
c = *++ptr;
/*
if (++label->l_Cre > 1)
xxxcerror(EERROR, "Duplicate label: %s", label->Name);
*/
}
while (c == ' ' || c == '\t')
c = *++ptr;
if (c != '\n') { /* opcode/directive */
char *skip = ptr;
while (c != '\n' && c != ' ' && c != '\t' && c != '.') {
if (c >= 'a' && c <= 'z')
*ptr &= ~0x20; /* -> upper case */
c = *++ptr;
}
*ptr = 0;
mc->OpCode = GetOpByName(skip);
if (c == '.') {
mc->OpSize = CToSize(*++ptr);
c = *++ptr;
}
if (mc->OpCode == NULL)
cerror(EERROR_UNKNOWN_DIRECTIVE, skip);
if (c != '\n') {
while (c == ' ' || c == '\t')
c = *++ptr;
mc->m_Operands = ptr;
} else {
mc->m_Operands = "";
}
while (c != '\n')
c = *++ptr;
}
*ptr++ = 0;
if (mc->OpCode && mc->OpCode->Id < 0)
ExecOpCodeA(mc);
}
MBase[MLines] = NULL;
}